package com.hsp.Demo_05_extends.animal;

public class Demo_Animal {
    public static void main(String[] args) {
        Animal cat = new Cat();
        cat.eat();
        cat.run();
        /*
            由于是用父类的引用接收的子类的对象，所以，在编译时期，是看的编译类型
        编译类型是Animal，所以就只能调用父类中有的方法和属性。
            因此在这里无法调用Cat独有的方法。
        向上转型: (子类的对象，用父类的引用来接收，但是该对象的实际类型还是子类的类型)
            编译时期，看的是编译类型。
            运行时期，看的是运行类型。
         向下转型：
            由于使用父类的引用来接收子类的对象，在编译时期，只能调用父类的方法。
            所以有了向下转型：
                子类类型  子类引用 = （子类类型）父类引用
                但是这个强转只有当父类引用的运行类型与子类类型一致时，才允许进行强转。
         */
//        cat.eat02();
        /*
        由上可知，cat的编译类型为Animal，但是运行类型为Cat.
        所以在此处进行强转，是可以的。
        但是如果强转成Dog，就是会报错的。
        意思是： Cat对象不能强转成Dog对象。
         */
        Cat cat02 = (Cat)cat;

        System.out.println(cat.name);
        System.out.println(cat.age);
        //小王， 属性就看编译类型，不会区分编译时期和运行时期，编译类型是啥，输出的就是相应的类型的值。
        System.out.println(cat02.name);

        if( cat instanceof Animal){
            System.out.println("cat02是Animal类型或者是Animal的子类");
        }
    }
}
